package com.sakura.java8.lambda;

import com.sakura.java8.lambda.pojo.Employee;
import com.sakura.java8.lambda.test.service.MyFunction;
import com.sakura.java8.lambda.test.service.MyFunction2;
import org.junit.Test;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * @Author Sakura
 * @Date 2022/11/7 15:34
 * @Version 1.0
 */
public class TestLambda1 {

    List<Employee> emps = Arrays.asList(
            new Employee(101, "张三", 18, 9999.99),
            new Employee(102, "李四", 59, 6666.66),
            new Employee(103, "王五", 28, 3333.33),
            new Employee(104, "赵六", 8, 7777.77),
            new Employee(105, "田七", 38, 5555.55)
    );

    /**
     * 使用Collectioons.sort()方法,通过定制排序比较两个 Employee(先按年龄比，年龄相同再按姓名比);使用lambda作为参数传递
     */
    @Test
    public void test01(){
        Collections.sort(emps,(a,b)->{
            if(a.getAge() == b.getAge()){
                return a.getName().compareTo(b.getName());
            }else{
                return -Integer.compare(a.getAge(),b.getAge());
            }
        });

        for (Employee emp : emps) {
            System.out.println(emp);
        }
    }

    /**
     * ①声明函数式接口，接口中声明抽象方法，public String getvalue(string str):
     * ②声明类 TEstLambda，类中编与万法使用接口作为参数，将一个字符串换成大写，并作为方法的返回值。
     * ③再将一个字符串的第2个和第4个索引位置进行截取子串。
     */
    @Test
    public void test02(){
        String oldStr="\t\t\t   佛山无影脚";
        System.out.println("oldStr = " + oldStr);
        String newStr = strHhandler(oldStr, str -> str.trim());
        System.out.println("newStr = " + newStr);

        System.out.println("---------------------------------------------");
         oldStr="佛山无影脚";
        System.out.println("oldStr = " + oldStr);
         newStr = strHhandler(oldStr, str -> str.substring(0,2));
        System.out.println("newStr = " + newStr);

    }

    public String strHhandler(String str, MyFunction mf){
        return mf.getValue(str);
    }

    /**
     * ①声明一个带两个泛型的两数式接口，泛型类型为<T,R> T 为参数，R 为返回值。
     * ②接口中声明对应轴象方法
     * ③在 Testlambda 类中声明方法， 使用接口作为参数，计算两个 long 型参数的和。
     * ④再计算两个 long 型参数的乘积。
     */
    @Test
    public void test03(){
        op(100L,200L,(x,y)->x*y);
        op(100L, 200L, (x, y) -> x + y);
    }

    public void op(Long a, Long b, MyFunction2<Long, Long> mf) {
        System.out.println(mf.getValue(a, b));
    }

}
